package pers.tz.题目.leetcode;

import java.util.Stack;

/**
 * @author irony
 * @date 2024-03-12
 */
public class leetcode_0155_最小栈 {
//设计一个支持 push ，pop ，top 操作，并能在常数时间内检索到最小元素的栈。
//
// 实现 MinStack 类:
//
// MinStack() 初始化堆栈对象。
// void push(int val) 将元素val推入堆栈。
// void pop() 删除堆栈顶部的元素。
// int top() 获取堆栈顶部的元素。
// int getMin() 获取堆栈中的最小元素。
//
// 示例 1:
//输入：
//["MinStack","push","push","push","getMin","pop","top","getMin"]
//[[],[-2],[0],[-3],[],[],[],[]]
//
//输出：
//[null,null,null,null,-3,null,0,-2]
//
//解释：
//MinStack minStack = new MinStack();
//minStack.push(-2);
//minStack.push(0);
//minStack.push(-3);
//minStack.getMin();   --> 返回 -3.
//minStack.pop();
//minStack.top();      --> 返回 0.
//minStack.getMin();   --> 返回 -2.
//
// 提示：
// -2³¹ <= val <= 2³¹ - 1
// pop、top 和 getMin 操作总是在 非空栈 上调用
// push, pop, top, and getMin最多被调用 3 * 10⁴ 次

    public static void main(String[] args) {
        MinStack minStack = new MinStack();
        minStack.push(1);
        minStack.pop();
        int top = minStack.top();
        int min = minStack.getMin();
    }
}

class MinStack {
    // 数据栈
    private Stack<Integer> dataStack;
    // 最小栈
    private Stack<Integer> minStack;

    public MinStack() {
        this.dataStack = new Stack<>();
        this.minStack = new Stack<>();
        this.minStack.push(Integer.MAX_VALUE);
    }

    public void push(int val) {
        this.dataStack.push(val);
        this.minStack.push(Math.min(this.minStack.peek(), val));
    }

    public void pop() {
        this.dataStack.pop();
        this.minStack.pop();
    }

    public int top() {
        return this.dataStack.peek();
    }

    public int getMin() {
        return this.minStack.peek();
    }
}
